#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void swap(char *buf1, char *buf2, int width)
{
    int i=0;
    for(i=0;i<width;i++)
    {
        int tem=0;
        tem=*buf1;
        *buf1=*buf2;
        *buf2=tem;
        buf1++;
        buf2++;
    }
}
//比较一维数组
int cmp(const void*e1,const void*e2)
{
    return (*(char*)e1 - *(char*)e2);
}
//实现一个类似于qsort函数的冒泡排序
void bubble_sort(void *base,int num,int width,int (*cmp)(const void*e1,const void *e2))
{
    int i=0;
    int j=0;
    //冒泡排序实现升序输出
    //i表示进行几趟排序
    for(i=0;i<num-1;i++)
    {
        //j表示一个数字比较几次
        for(j=0;j<num-1-i;j++)
        {
         
                //结构体的比较函数不能与下面这个if（）里的函数共用，棋会按照结构体里内容的先后顺序来判断
                //想要比较结构体 使之按照要求的关键字排序就需要创建新的函数
            if(cmp((char*)(base+j*width) ,(char*)(base+(j+1)*width))>0)
            //强制类型转换 因为我们不能肯定要判断的内容是什么类型 所以一个一个字节比较
            {
                //一个字节一个字节内容交换
               //使用swap函数实现交换
               swap((char*)(base+j*width) ,(char*)(base+(j+1)*width),width);
            }
        }
    }
}

//
//struct 结构体 
//
struct stu
{
    char name[20];
    int age; 
};
// //比较结构体 age作为关键词 函数应该用下例
// int cmp_struct_age(const void*e1 , const void*e2)
// {
//     return ((struct stu*)e1)->age - ((struct stu*)e2)->age;
// }
// //比较结构体 name作为关键词
// int cmp_struct_age(const void*e1 , const void*e2)
// {
//     return strcmp(((struct stu*)e1)->name,((struct stu*)e2)->name);
// }
int main()
{
    //比较一维整形数组
    int arr[10]={9,8,7,6,5,4,3,2,1,0};
    int i=0;
    int num=sizeof(arr)/sizeof(arr[0]);
    //调用bubble_sort函数
    bubble_sort(arr,num,sizeof(arr[0]),cmp);
    //打印
    for(i=0;i<num;i++)
    {
        printf("%d ",arr[i]);
    }
    printf("\n");
    //#####################
    //比较字符
    char ch[]="gfedcba";
    int num1=sizeof(ch)/sizeof(ch[0]);
    bubble_sort(ch,num1,sizeof(ch[0]),cmp);
    //打印输出
    for(i=0;i<num1;i++)
    {
        printf("%c ",ch[i]);
    }
    printf("\n");
    //############3########
    //比较结构体内容
    struct stu S[3]={{"zhangsan",18},{"wangwu",10},{"lisi",24}};
    int num2=sizeof(S)/sizeof(S[0]);
    bubble_sort(S,num2,sizeof(S[0]),cmp);
    //打印输出
    for(i=0;i<3;i++)
    {
        printf("%s,%d  ",S[i].name,S[i].age);
    }
    return 0;
}